Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра САПР
Звіт
Про виконання
Лабораторної роботи №10
Тема: Програмування системного таймера 8253/8254
Виконала:
студентка групи КН-3
Львів – 2009
Тема: Програмування системного таймера 8253/8254.
Мета: Навчитися програмувати системний таймер 8253/8254.
Завдання
Запрограмувати таймер на виконання мелодії Ricky Martin “Living La Vida Loca” за вказаним кодом:
Cis3(1/16), P(1/8), P(1/16), Cis3(1/4), P(1/16), P(1/16), A2(1/8), H2(1/8), D3(1/16), P(1/8), P(1/16), D3(1/16), P(1/8), P(1/16), Cis3(1/4), P(1/4), P(1/8), Cis3(1/16), P(1/8), P(1/16), Cis3(1/4), P(1/16), P(1/16), A2(1/8), Gis2(1/8), H2(1/8), P(1/8), A2(1/4), P(1/4), P(1/8), Cis3(1/16), P(1/8), P(1/16), Cis3(1/4), P(1/8), A2(1/8), H2(1/8), D3(1/16), P(1/8), P(1/16), D3(1/16), P(1/8), P(1/16), Cis3(1/4), P(1/4), P(1/8), Cis(1/16), P(1/8), P(1/16), Cis3(1/4), P(1/8).
Короткі теоретичні відомості
061H ■PC/XT■ PPI (програмований периферійний інтерфейс), порт B.
╓7┬6┬5┬4┬3┬2┬1┬0╖ біт
║_│_│_│_│_│0│_│_║
║ ╚═► 0: Таймер 2 вхід (спікер) ═╦═► OR 03H=спікер ON
╚═══► 1: Таймер 2 данні ═════╝ AND 0fcH=спікер OFF
Для занесення частоти звучання динаміка використовую канал 2 системного таймера з адресою 42h
Структура регістра керуючого слова системного таймера:
7 6 5 4 3 2 1 0
Біти:
0 – встановлення типу рахунку таймера (0 – двійковий, 1 – десятковий)
1,2,3 – встановлення режиму роботи вибраного каналу таймера (від 0 до 5-ти)
4,5 – код команди читання/запису регістра лічильника (01 – старший байт, 10 – молодший, 11 – спочатку молодшого, а потім старшого)
6,7 – вибір каналу таймера (0 – 2 канали, 11 – код читання стану каналу)
Код програми
.8086
code segment
org 100h
assume cs:code,ds:code,es:code,ss:code
start:
mov ax,1 ;встановлення значення початкової ноти
push ax
xor ax,ax ;обнулення ax
xor al,00000011b ; встановлення байта дозволу динаміка
out portb,al ; записуєм байт у відповідний порт
mov si,0 ; обнулюю si
mov al,10110110b ; запис значення керуючого регістра
out reg,al ; його завантаження
next:
pop bx ;в стеку - порядковий номер ноти
mov al,bl ; в al - номер ноти
inc bx ; збільшення номера і запис в стек
push bx
cmp al,54 ;53 ноти, якщо 54-та - вихід
je no_more
cbw ; розширення вмісту al до ax
lea bx,freq ; адреса з частотами нот
dec ax ;зменшення пор. номера ноти на 1
shl ax,1 ; множення на 2 (бо працюэмо зі словами)
mov di,ax ; зміщення відносно початку адреси нот до поточної в di
mov dx,[bx][di] ; читаємо в dx частоту ноти
mov al,dl ;записуэмо молодший байт частоти звучання
out chan2,al
mov al,dh ;старший байт
out chan2,al
mov ah,0 ; 0-ва ф-ція - отримати значення системного таймера
int 1ah
lea bx,beat ; завантаження адреси довжин звучання зквуку
mov cl,[bx][si] ; довжина поточної ноти в cx
mov ch,0
mov bx,dx
add bx,cx ; відлік від поточного часу
st_sou:
int 1ah ; знову отримуєм значення системного таймеру
cmp dx,bx ; порівнюєм з потрібним
jne st_sou ; не рівні - продовжуєм звучання
inc si ; додаємо номер довжини ноти
jmp next ; перехід на звучання наступної ноти
no_more:
in al,portb ; дістаємо байт стану динаміка
and al,11111100b ; обнулення бітів активації динаміка
out 61h,al
pop bx ; вирівнювання стеку
mov ah,4ch ; вихід з програми
int 21h
beat db 1,2,1,4,1,1,2,2,1,2,1,1,2,1,4,4,2,1,2,1,4,1,1,2,2,2,2,2,2,4,4,2,1,2,1,4,2,2,2,1,2,1,1,2,1,4,4,2,1,2,1,4,2
freq dw 0432h,0,0,0432h,0,0,0a97h,096fh,03f7h,0,0,03f7h,0,0,0432h,0,0,0432h,0,0,0432h,0,0,0a97h,059ch,096fh,0,096fh,0,0a97h,0,0,0432h,0,0,0432h,0,0a97h,096fh,03f7h,0,0,03f7h,0,0,0432h,0,0,10d0h,0,0,0432h,0
portb equ 61h
chan2 equ 42h
reg equ 43h
code ends
end start
lst – код
Turbo Assembler Version 4.1 01/19/09 14:13:28 Page 1
l10.asm
1 .8086
2 00...